#include "apue.h"
#include <netdb.h>
#include <errno.h>
#include <syslog.h>
#include <sys/socket.h>
#include <string.h>

#define BUFLEN	128
#define QLEN 10

#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 256
#endif

int initserver();

void
serve(int sockfd)
{
	int		clfd;
	FILE	*fp;
	char	buf[BUFLEN];

	for (;;) {
		clfd = accept(sockfd, NULL, NULL);
		if (clfd < 0) {
			printf("accept error \n");
			exit(1);
		}
		if ((fp = popen("/root/unix/sockets/uptime", "r")) == NULL) {
			sprintf(buf, "error: %s\n", strerror(errno));

			send(clfd, buf, strlen(buf), 0);
		} else {
			while (fgets(buf, BUFLEN, fp) != NULL)
				send(clfd, buf, strlen(buf), 0);
			pclose(fp);
		}
		close(clfd);
	}
}

int
main(int argc, char *argv[])
{
// 	struct addrinfo	*ailist, *aip;
// 	struct addrinfo	hint;
// 	int				sockfd, err, n;
// 	char			*host;

// 	if (argc != 1)
// 		err_quit("usage: ruptimed");
// #ifdef _SC_HOST_NAME_MAX
// 	n = sysconf(_SC_HOST_NAME_MAX);
// 	if (n < 0)	/* best guess */
// #endif
// 		n = HOST_NAME_MAX;
// 	host = malloc(n);
// 	if (host == NULL)
// 		err_sys("malloc error");
// 	if (gethostname(host, n) < 0)
// 		err_sys("gethostname error");
// 	//daemonize("ruptimed");

// 	printf("%s\n", host);
// 	hint.ai_flags = AI_CANONNAME;
// 	hint.ai_family = 0;
// 	hint.ai_socktype = SOCK_STREAM;
// 	hint.ai_protocol = 0;
// 	hint.ai_addrlen = 0;
// 	hint.ai_canonname = NULL;
// 	hint.ai_addr = NULL;
// 	hint.ai_next = NULL;
// 	if ((err = getaddrinfo(host, "test", &hint, &ailist)) != 0) {
// 		syslog(LOG_ERR, "ruptimed: getaddrinfo error: %s",
// 		  gai_strerror(err));
// 		printf("getaddrinfo error\n");
// 		exit(1);
// 	}
// 	for (aip = ailist; aip != NULL; aip = aip->ai_next) {
// 		if ((sockfd = initserver(SOCK_STREAM, aip->ai_addr,
// 		  aip->ai_addrlen, QLEN)) >= 0) {
// 			serve(sockfd);
// 		printf("initserver successsfully\n");
// 			exit(0);
// 		}

// 	}

	int fd;
	if (fd = initserver() < 0){
		printf("initserver error \n");
		return 0;
	}
	printf("initserver successsfully\n");
	serve(fd);

	exit(1);
}


int
initserver()
{
	int fd;
	if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
		printf("socket error \n");
		return(-1);
	}

	struct sockaddr_in addr_ser;

	addr_ser.sin_family = AF_INET;
	addr_ser.sin_port = htons(1222);
	addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);

	if (bind(fd, (struct sockaddr *)&addr_ser, sizeof(struct sockaddr_in)) < 0) {
		printf("bind error \n");
		return -1;
	}

	if (listen(fd, 5) < 0) {
		printf("listen error \n");
		return -1;
	}

	return fd;
}

